#include <stdio.h>
#include <stdlib.h>
#include "headers/const.h"
#include "headers/position.h"
#include "headers/verification.h"
#include "headers/ia.h"

void initCoupJouable(pos grille[LIGNE][COLONNE], posia p)
{
	int i,j;

	for(i=0; i<COLONNE ; i++)
	{
		j = recupLigne(grille, i); // On recupère la première ligne jouable

		if(j != -1) { // Si la colonne n'est pas pleine
			p->tabPosJouable[i] = (pos) malloc(sizeof(struct position));
			p->tabPosJouable[i] = grille[j][i];
		}
		else {
			pos posInjouable = (pos) malloc(sizeof(struct position));
			posInjouable->joueur = 'N';
			posInjouable->y = i;
			posInjouable->x = -1;
			p->tabPosJouable[i] = posInjouable;
		}
	}
}

	

void calculIA(pos grille[LIGNE][COLONNE], posia p, int profondeur)
{
	int max = -1000;
	int i;
	int j= 0;
	int tmp;
	int maxi, maxj;

	// On boucle sur toutes les positions vides jouable
	for(i=0; i < COLONNE-1; i++)
	{
		if(placerPion(i, grille, JOUEUR2)) { // On simule le coup
			tmp = min(grille, p->tabPosJouable[i], profondeur-1);
			
			if(tmp > max) {
				max = tmp;
				maxi = i;
				maxj = j;
			}

	}


	grille[maxi][maxj]->joueur = JOUEUR2;
}

int max(pos grille[LIGNE][COLONNE], posia p, int profondeur)
{
	if(profondeur == 0)
		return eval(grille, p);
	
	int max = -1000;
	int i;
	int tmp;
	
	for(i=0; i < COLONNE-1; i++)
	{
			
		p->tabPosJouable[i]->joueur = JOUEUR2;
		tmp = min(grille, p, profondeur);
		
		if(tmp > max)
			max = tmp;

		p->tabPosJouable[i]->joueur = VIDE;
	}
	
	return max;
}

int min(pos grille[LIGNE][COLONNE], posia p, int profondeur)
{
	if(profondeur == 0)
		return eval(grille, p);
	
	int min = 1000;
	int i;
	int tmp;
	
	for(i=0; i < COLONNE-1; i++)
	{
		
		p->tabPosJouable[i]->joueur = JOUEUR1;
		tmp = max(grille , p, profondeur);

		if(tmp > min)
			min = tmp;

		p->tabPosJouable[i]->joueur = VIDE;
	}

	return min;
}

int eval(pos grille[LIGNE][COLONNE], pos ps)
{
int x; // permet de savoir si le joueur va gagner	
		
		// TEST POUR JOUEUR1 
		ps->joueur = JOUEUR1; // affecte joueur 1 a la 1ere position jouable libre
		x = verifPuissance4(grille, ps->y); 
		
		if( x == 1)
			return 1001;
		else
		{
			// TEST POUR JOUEUR2
			ps->joueur = JOUEUR2;
			x = verifPuissance4(grille, ps->y);
			
			if( x == 1)
				return 1001;
			
		}	
		ps->joueur = VIDE;
		return -1001; // min-max

	return 0;
}
